package model

// RuleRaw rule原始数据 sqlite 和 乐山下发的redis的2套规则数据, 都转成这个后再统一处理
type RuleRaw struct {
	Id             string         `json:"id"`
	RuleId         string         `json:"ruleId"`
	Status         string         `json:"status"`
	PtIdList       string         `json:"ptIdList"`
	RuleExpression string         `json:"ruleExpression"`
	ExpressionList string         `json:"expressionList"`
	LinkageListRaw string         `json:"linkageList"`
	AlarmTime      string         `json:"alarmTime"`
	LinkageList    []LinkagePoint `json:"-"`
}

// RuleDef one rule define single
type RuleDef struct {
	Id             string         `json:"id"`             // 乐山节点的Id
	RuleId         string         `json:"ruleId"`         // 规则Id
	Status         string         `json:"status"`         // 1 启用 0 停止
	AlarmTime      string         `json:"alarmTime"`      // 报警时间 触发周期 s秒
	PtIdList       string         `json:"ptIdList"`       // 可以去掉 ptid 列表和秒数
	ExpressionList string         `json:"expressionList"` // 可以去掉 表达式列表,逗号分隔
	RuleExpression string         `json:"ruleExpression"` // 可以去掉 完整的正则表达式
	BoolExpr       string         `json:"boolExpr"`       // BoolExpr 压缩 RuleExpression 后的结果
	LastBool       bool           `json:"lastBool"`       // 上次布尔值 默认就是false
	LinkageList    []LinkagePoint `json:"linkageList"`    // 反控相关
	RuleItems      []RuleItem     `json:"ruleItems"`      // 规则小块 数据
}

type RuleBase struct {
	Type     RuleType `json:"type"`     // 规则类型 正常 normal change count
	PtId     string   `json:"ptId"`     // 单点位id
	Duration int      `json:"duration"` // 时间 s秒 @符号后面的
	BoolAbbr string   `json:"boolAbbr"` // 表达式缩写,boolean
}

type RuleItem struct {
	RuleBase
	LeftExpr   string `json:"leftExpr,omitempty"`   // 最左表达式 普通和count
	CountExpr  string `json:"countExpr,omitempty"`  // count 表达式
	Left       string `json:"left,omitempty"`       // change to 左边
	Right      string `json:"right,omitempty"`      // change to 右边
	ChangeExpr string `json:"changeExpr,omitempty"` // change to表达式
}

type LinkagePoint struct {
	CInsId           int           `json:"cInsId"`           // 控制器实体Id
	PtInsId          int           `json:"ptInsId"`          // 点位实体ID
	TriggerInterval  int64         `json:"triggerInterval"`  // 延时时间s 秒
	Retry            int           `json:"retry"`            // 重试次数
	PtId             string        `json:"ptId"`             // pt_id
	Addr             string        `json:"addr"`             // 点位地址
	OnErr            string        `json:"onErr"`            // 错误操作
	SetPointOperator PointOperator `json:"setpointOperator"` // 联动运算符
	SetPointValue    float64       `json:"setpointValue"`    // 联动值
}
